/**
 * @file daemon.c
 * @brief 守护进程模块实现
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "daemon.h"

int daemon_init(void) {
    pid_t pid;

    // 创建子进程
    pid = fork();
    if (pid < 0) {
        perror("fork");
        return -1;
    }

    // 父进程退出
    if (pid > 0) {
        exit(0);
    }

    // 创建新会话
    if (setsid() < 0) {
        perror("setsid");
        return -1;
    }

    // 改变工作目录
    if (chdir("/") < 0) {
        perror("chdir");
        return -1;
    }

    // 重设文件创建掩码
    umask(0);

    // 关闭标准输入输出和错误输出
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);

    // 重定向标准输入输出和错误输出到/dev/null
    open("/dev/null", O_RDWR);
    dup(0);
    dup(0);

    return 0;
}